﻿using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using BUS;
using DTO;
namespace PhanMemSapThoiKhoaBieu
{
    public partial class FormSapTKB : Form
    {
        public FormSapTKB()
        {
            InitializeComponent();
        }

        private void HienThiDanhSach()
        {
            List<LopDTO> lst = LopHocBUS.LayDanhSach();
            cbLop.DataSource = lst;
            cbLop.ValueMember = "ID";
            cbLop.DisplayMember = "TenLop";

            List<KhoiDTO> lst2 = KhoiBUS.LayDanhSach();
            cbKhoi.DataSource = lst2;
            cbKhoi.ValueMember = "ID";
            cbKhoi.DisplayMember = "TenKhoi";
        }

        private void FormSapTKB_Load(object sender, EventArgs e)
        {
            HienThiDanhSach();
        }

        private void HienThiDanhSachGiaoVienTheoLop()
        {
            dgvDanhSachGiaoVien.Rows.Clear();
            DataTable dt = GiaoVienBUS.LayDanhSachGVTheoLop(cbLop.SelectedValue.ToString());
            for (int i = 0; i < dt.Rows.Count; i++)
            {
                dgvDanhSachGiaoVien.Rows.Add();
                dgvDanhSachGiaoVien.Rows[i].Cells[0].Value = dt.Rows[i][0].ToString();
                dgvDanhSachGiaoVien.Rows[i].Cells[1].Value = dt.Rows[i][1].ToString();
                dgvDanhSachGiaoVien.Rows[i].Cells[2].Value = "";
            }
        }

        private void HienThiDanhSachGiaoVienTheoKhoi()
        {
            dgvDanhSachGiaoVien.Rows.Clear();
            DataTable dt = GiaoVienBUS.LayDanhSachGVTheoKhoi(cbKhoi.SelectedValue.ToString());
            for (int i = 0; i < dt.Rows.Count; i++)
            {
                dgvDanhSachGiaoVien.Rows.Add();
                dgvDanhSachGiaoVien.Rows[i].Cells[0].Value = dt.Rows[i][0].ToString();
                dgvDanhSachGiaoVien.Rows[i].Cells[1].Value = dt.Rows[i][1].ToString();
                dgvDanhSachGiaoVien.Rows[i].Cells[2].Value = "";
            }
        }

        private void HienThiDanhSachMonHocTheoKhoi()
        {
            dgvDanhSachMonHoc.Rows.Clear();
            DataTable dt = MonHocBUS.LayDanhSachMHTheoKhoi(cbKhoi.SelectedValue.ToString());
            for (int i = 0; i < dt.Rows.Count; i++)
            {
                dgvDanhSachMonHoc.Rows.Add();
                dgvDanhSachMonHoc.Rows[i].Cells[0].Value = dt.Rows[i][0].ToString();
                dgvDanhSachMonHoc.Rows[i].Cells[1].Value = dt.Rows[i][1].ToString();
                dgvDanhSachMonHoc.Rows[i].Cells[2].Value = dt.Rows[i][2].ToString();
            }
        }

        private void HienThiDanhSachMonHocTheoLop()
        {
            dgvDanhSachMonHoc.Rows.Clear();
            DataTable dt = MonHocBUS.LayDanhSachMHTheoLop(cbLop.SelectedValue.ToString());
            for (int i = 0; i < dt.Rows.Count; i++)
            {
                dgvDanhSachMonHoc.Rows.Add();
                dgvDanhSachMonHoc.Rows[i].Cells[0].Value = dt.Rows[i][0].ToString();
                dgvDanhSachMonHoc.Rows[i].Cells[1].Value = dt.Rows[i][1].ToString();
                dgvDanhSachMonHoc.Rows[i].Cells[2].Value = dt.Rows[i][2].ToString();
            }
        }


        private void cbLop_SelectedIndexChanged(object sender, EventArgs e)
        {
            if (cbLop.SelectedIndex >= 0)
            {
                HienThiDanhSachGiaoVienTheoLop();
                HienThiDanhSachMonHocTheoLop();
                
            }
        }

        private void rdbLop_CheckedChanged(object sender, EventArgs e)
        {
            if (rdbLop.Checked == true)
            {
                cbLop.Enabled = true;
                cbKhoi.Enabled = false;
            }
            else
            {
                cbLop.Enabled = false;
                cbKhoi.Enabled = true;
            }
        }

        private void btnSapThoiKhoaBieu_Click(object sender, EventArgs e)
        {
            //de sap tkb can co ten lop can sap, so giao vien phu trach lop, so mon hoc cua lop, so tiet hoc trong tuan
            if (rdbLop.Checked == true)
            {
                SapThoiKhoaBieuMotLop(cbLop.SelectedValue.ToString());
            }
            else
            {
                //kiểm tra xem có thời khóa biểu nào của 1 lớp trong khối được sắp chưa?
                //nếu có rồi thì hỏi người dùng xem muốn tạo mới ko
                //nếu chưa có thì thực hiện sắp TKB theo khối bthường
                string idKhoi = cbKhoi.SelectedValue.ToString();
                if (ThoiKhoaBieuBUS.KiemTraThoiKhoaBieuKhoi(idKhoi) == true)
                {
                    List<LopDTO> lstLop = LopHocBUS.LayDanhSachTheoKhoi(idKhoi);
                    for (int i = 0; i < lstLop.Count; i++)
                    {
                        SapThoiKhoaBieuMotLop(lstLop[i].ID);
                    }
                }
                else
                {
                    DialogResult dr = MessageBox.Show("Đã có thời khóa biểu được sắp. Bạn muốn sắp mới lại?", "Thông báo", MessageBoxButtons.YesNoCancel, MessageBoxIcon.Question);
                    if (dr == DialogResult.Yes)
                    {
                        //xóa tất cả tkb cũ
                        ThoiKhoaBieuBUS.XoaThoiKhoaBieuKhoi(idKhoi);
                        //sắp lại tkb cho các lớp
                        List<LopDTO> lstLop = LopHocBUS.LayDanhSachTheoKhoi(idKhoi);
                        for (int i = 0; i < lstLop.Count; i++)
                        {
                            SapThoiKhoaBieuMotLop(lstLop[i].ID);
                        }
                    }
                }
            }
        }

        public void SapThoiKhoaBieuMotLop(string idLop)
        {
            List<MonHoc> lstMonHoc = new List<MonHoc>();

            DataTable dt = MonHocBUS.LayDanhSachMHTheoKhoi_Mon(idLop);
            for (int i = 0; i < dt.Rows.Count; i++)
            {
                MonHoc mh = new MonHoc();
                mh.TenMonHoc = dt.Rows[i][0].ToString();
                mh.SoTietHocTrongTuan = int.Parse(dt.Rows[i][1].ToString());
                mh.SoTietTrenBuoi = int.Parse(dt.Rows[i][2].ToString());
                lstMonHoc.Add(mh);
            }

            List<GiaoVien> lstGVien = new List<GiaoVien>();

            DataTable dt2 = GiaoVienBUS.LayDanhSachGVTheoLop2(idLop);
            for (int i = 0; i < dt2.Rows.Count; i++)
            {
                GiaoVien gv = new GiaoVien();
                gv.IdGiaoVien = dt2.Rows[i][0].ToString();
                gv.HoTen = dt2.Rows[i][1].ToString();
                if (dt2.Rows[i][2].ToString().CompareTo("LGV001") == 0)
                {
                    gv.LaGVCN = true;
                }
                else
                {
                    gv.LaGVCN = false;
                    if (dt2.Rows[i][2].ToString().CompareTo("LGV002") == 0)
                    {
                        gv.MonHocPhuTrach = "Thể dục";
                    }
                    else
                    {
                        gv.MonHocPhuTrach = "Ngoại ngữ";
                    }
                }
                lstGVien.Add(gv);
            }

            List<TietCoDinh> lstTiet = new List<TietCoDinh>();
            DataTable lstQuyDinh = QuyDinhTietHocBUS.LayDanhSach();
            for (int i = 0; i < lstQuyDinh.Rows.Count; i++)
            {
                TietCoDinh item = new TietCoDinh();
                item.MonHoc = lstQuyDinh.Rows[i][0].ToString();
                item.Buoi = lstQuyDinh.Rows[i][1].ToString();
                item.Thu = lstQuyDinh.Rows[i][2].ToString();
                item.Tiet = int.Parse(lstQuyDinh.Rows[i][3].ToString());
                item.SapHoacTranh = bool.Parse(lstQuyDinh.Rows[i][4].ToString());
                lstTiet.Add(item);
            }
            string _loi = "";
            SapThoiKhoaBieu stk = new SapThoiKhoaBieu();
            stk.SapTKB(lstMonHoc, lstGVien, lstTiet, ref _loi);
            if (_loi != "")
            {
                DialogResult dr = MessageBox.Show(_loi + " Bạn có muốn lưu thời khóa biểu?", "Thông báo", MessageBoxButtons.YesNoCancel, MessageBoxIcon.Question);
                if (dr == DialogResult.No)
                {
                    return;
                }
            }
           
            //save bảng thời khóa biểu
            ThoiKhoaBieuDTO tkb = new ThoiKhoaBieuDTO();
            tkb.ID = ThoiKhoaBieuBUS.MaTangTuDong();
            tkb.IDLop = idLop;
            tkb.NgayTao = DateTime.Now;
            tkb.TinhTrangXoa = false;
            bool kq = ThoiKhoaBieuBUS.Them(ref tkb);

            for (int ngay = 0; ngay < 6; ngay++)
            {
                for (int tiet = 0; tiet < 5; tiet++)
                {
                    if (stk.BangTKB[tiet][ngay] != null)
                    {
                        ChiTietThoiKhoaBieuDTO ct = new ChiTietThoiKhoaBieuDTO();
                        ct.ID = ChiTietThoiKhoaBieuBUS.MaTangTuDong();
                        ct.IDMonHoc = stk.BangTKB[tiet][ngay];
                        ct.Thu = "Thứ " + (ngay + 2).ToString();
                        ct.Tiet = tiet + 1;
                        ct.IDThoiKhoaBieu = tkb.ID;
                        ct.IDGiaoVien = "";
                        string tenMonHoc = MonHocBUS.LayTenMonHoc(ct.IDMonHoc);
                        if (tenMonHoc == "Thể dục")
                        {
                            for (int i = 0; i < dt2.Rows.Count; i++)
                            {
                                if (dt2.Rows[i][2].ToString().CompareTo("LGV002") == 0)
                                {
                                    ct.IDGiaoVien = dt2.Rows[i][0].ToString();
                                    break;
                                }
                            }
                        }
                        else if (tenMonHoc == "Ngoại ngữ")
                        {
                            for (int i = 0; i < dt2.Rows.Count; i++)
                            {
                                if (dt2.Rows[i][2].ToString().CompareTo("LGV003") == 0)
                                {
                                    ct.IDGiaoVien = dt2.Rows[i][0].ToString();
                                    break;
                                }
                            }
                        }
                        else
                        {
                            for (int i = 0; i < dt2.Rows.Count; i++)
                            {
                                if (dt2.Rows[i][2].ToString().CompareTo("LGV001") == 0)
                                {
                                    ct.IDGiaoVien = dt2.Rows[i][0].ToString();
                                    break;
                                }
                            }
                        }

                        ChiTietThoiKhoaBieuBUS.Them(ct);
                    }
                }
            }

            if (kq == true)
            {
                MessageBox.Show("Tạo TKB thành công", "Thông báo", MessageBoxButtons.OK, MessageBoxIcon.Information);
            }
        }

        private void cbKhoi_SelectedIndexChanged(object sender, EventArgs e)
        {
            if (cbLop.SelectedIndex >= 0)
            {
                HienThiDanhSachGiaoVienTheoKhoi();
                HienThiDanhSachMonHocTheoKhoi();
            }
        }

        private void btnXemTKB_Click(object sender, EventArgs e)
        {
            FormXemThoiKhoaBieu frm = new FormXemThoiKhoaBieu();
            frm.ShowDialog();
        }
    }
}
